/*-------------------------------------------------------------------------
 *
 * valid.h
 *      POSTGRES tuple qualification validity definitions.
 *
 *
 * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/access/valid.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef VALID_H
#define VALID_H

/*
 *        HeapKeyTest
 *
 *        Test a heap tuple to see if it satisfies a scan key.
 */
#define HeapKeyTest(tuple, \
                    tupdesc, \
                    nkeys, \
                    keys, \
                    result) \
do \
{ \
    /* Use underscores to protect the variables passed in as parameters */ \
    int            __cur_nkeys = (nkeys); \
    ScanKey        __cur_keys = (keys); \
 \
    (result) = true; /* may change */ \
    for (; __cur_nkeys--; __cur_keys++) \
    { \
        Datum    __atp; \
        bool    __isnull; \
        Datum    __test; \
 \
        if (__cur_keys->sk_flags & SK_ISNULL) \
        { \
            (result) = false; \
            break; \
        } \
 \
        __atp = heap_getattr((tuple), \
                             __cur_keys->sk_attno, \
                             (tupdesc), \
                             &__isnull); \
 \
        if (__isnull) \
        { \
            (result) = false; \
            break; \
        } \
 \
        __test = FunctionCall2Coll(&__cur_keys->sk_func, \
                                   __cur_keys->sk_collation, \
                                   __atp, __cur_keys->sk_argument); \
 \
        if (!DatumGetBool(__test)) \
        { \
            (result) = false; \
            break; \
        } \
    } \
} while (0)

#endif                            /* VALID_H */
